home *** CD-ROM | disk | FTP | other *** search
/ User's Choice Windows CD / User's Choice Windows CD (CMS Software)(1993).iso / windows2 / icobar.zip / TOOLDEMO.C < prev    next >
C/C++ Source or Header  |  1992-01-09  |  15KB  |  459 lines

  1. /*
  2.    ****************************************************************************
  3.    Module:  tooldemo.c
  4.    Author:  Ray Donahue
  5.    Date:    1/8/92 (initial writing complete)
  6.  
  7.    Purpose: This is the main module which demonstrates the functions contained
  8.             in "toolwnd.dll".
  9.    ****************************************************************************
  10. */
  11.  
  12. #include "windows.h"
  13. #include "tooldemo.h"
  14. #include "toolwnd.h"
  15.  
  16. HANDLE hInst;
  17. static HWND hMainWindow;
  18. static HWND hToolBox,hToolBar;
  19. static BOOL fToolbox,fToolbar;
  20. static BOOL fToolsEnabled;
  21. static HMENU hMainMenu;
  22. static BOOL fHzScroll,fVtScroll;
  23. static WORD wVertPos,wHorzPos;
  24. static char szOutput[]="This line of text is controlled by the alignment menu or tools.";
  25.  
  26.  
  27. static void ToggleMenuItems(HMENU,WORD,WORD,WORD);
  28.  
  29. /* Initialize TOOINFO structure for toolbox */
  30. static TOOLINFO tBox[16]=
  31. {
  32.    /* wId,dwStyle,wState,rc */
  33.    IDM_POINTER,0,0,{0,0,0,0},
  34.    IDM_COMBOBX,0,0,{0,0,0,0},
  35.    IDM_CHECKBX,0,0,{0,0,0,0},
  36.    IDM_EDITCTL,0,0,{0,0,0,0},
  37.    IDM_PICTCTL,0,0,{0,0,0,0},
  38.    IDM_PUSHBTN,0,0,{0,0,0,0},
  39.    IDM_STATIC,0,0,{0,0,0,0},
  40.    IDM_TIMER,0,0,{0,0,0,0},
  41.    IDM_GROUPBX,0,0,{0,0,0,0},
  42.    IDM_LISTBOX,0,0,{0,0,0,0},
  43.    IDM_RADIOBTN,0,0,{0,0,0,0},
  44.    IDM_HORZSCRL,0,0,{0,0,0,0},
  45.    IDM_VERTSCRL,0,0,{0,0,0,0},
  46.    IDM_DIRBOX,0,0,{0,0,0,0},
  47.    IDM_DRIVEBOX,0,0,{0,0,0,0},
  48.    IDM_FILEBOX,0,0,{0,0,0,0}
  49. };
  50.  
  51. /* Initialize TOOLINFO structure for toolbar */
  52. static TOOLINFO tBar[13]=
  53. {
  54.    /* wId,dwStyle,wState,rc */
  55.    IDM_LARROW,WS_GROUP,0,{0,0,0,0},
  56.    IDM_RARROW,0,0,{0,0,0,0},
  57.    IDM_DARROW,0,0,{0,0,0,0},
  58.    IDM_UARROW,0,0,{0,0,0,0},
  59.    IDM_HLTEXT,WS_GROUP,0,{0,0,0,0},
  60.    IDM_HCTEXT,0,0,{0,0,0,0},
  61.    IDM_HRTEXT,0,0,{0,0,0,0},
  62.    IDM_VTTEXT,WS_GROUP,0,{0,0,0,0},
  63.    IDM_VCTEXT,0,0,{0,0,0,0},
  64.    IDM_VBTEXT,0,0,{0,0,0,0},
  65.    IDM_VIEW_H,WS_GROUP,0,{0,0,0,0},
  66.    IDM_VIEW_V,0,0,{0,0,0,0},
  67.    IDM_ABOUT,WS_GROUP,0,{0,0,0,0}
  68. };
  69.  
  70. /*
  71.    ****************************************************************************
  72.    WinMain()
  73.    The entry point for Windows.
  74.    ****************************************************************************
  75. */
  76.  
  77. int PASCAL WinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow)
  78. HANDLE hInstance;
  79. HANDLE hPrevInstance;
  80. LPSTR lpCmdLine;
  81. int nCmdShow;
  82. {
  83.    MSG msg;
  84.  
  85.    if (!hPrevInstance)
  86.       if (!InitApplication(hInstance))       /* Initialize shared things */
  87.          return (FALSE);                     /* Exits if unable to initialize */
  88.  
  89.    /* Perform initializations that apply to a specific instance */
  90.  
  91.    if (!InitInstance(hInstance, nCmdShow))
  92.       return (FALSE);
  93.  
  94.    /* Acquire and dispatch messages until a WM_QUIT message is received. */
  95.  
  96.    while (GetMessage(&msg,NULL,NULL,NULL))
  97.    {
  98.       TranslateMessage(&msg);                /* Translates virtual key codes */
  99.       DispatchMessage(&msg);                 /* Dispatches message to window */
  100.    }
  101.    return (msg.wParam);
  102. }
  103.  
  104. /*
  105.    ****************************************************************************
  106.    InitApplication()
  107.    Initializes window data and registers window classes.
  108.    ****************************************************************************
  109. */
  110.  
  111. BOOL InitApplication(hInstance)
  112. HANDLE hInstance;
  113. {
  114.    WNDCLASS  wc;
  115.  
  116.    /* Fill in window class structure with parameters that describe the */
  117.    /* main window. */
  118.  
  119.    wc.style = CS_BYTEALIGNWINDOW;
  120.    wc.lpfnWndProc = MainWndProc;
  121.    wc.cbClsExtra = 0;
  122.    wc.cbWndExtra = 0;
  123.    wc.hInstance = hInstance;
  124.    wc.hIcon = LoadIcon(hInstance,"tools");
  125.    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  126.    wc.hbrBackground = COLOR_WINDOW+1; 
  127.    wc.lpszMenuName =  "ToolDemoMenu";
  128.    wc.lpszClassName = "ToolDemoClass";
  129.  
  130.    /* Register the window class and return success/failure code. */
  131.    return(RegisterClass(&wc));
  132. }
  133.  
  134. /*
  135.    ****************************************************************************
  136.    InitInstance()
  137.    Saves instance handle and creates main window.
  138.    ****************************************************************************
  139. */
  140.  
  141. BOOL InitInstance(hInstance, nCmdShow)
  142. HANDLE          hInstance;
  143. int             nCmdShow;
  144. {
  145.    HWND hWnd;
  146.    HBITMAP hBitmap;
  147.    RECT rc;
  148.    HDC hdc;
  149.    BOOL fColor;
  150.  
  151.    /* Save the instance handle in static variable, which will be used in  */
  152.    /* many subsequence calls from this application to Windows. */
  153.  
  154.    hInst = hInstance;
  155.  
  156.    /* Create a main window for this application instance.  */
  157.  
  158.    hWnd = CreateWindow("ToolDemoClass","ToolDemo",
  159.       WS_OVERLAPPEDWINDOW|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL,0,0,
  160.       GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),
  161.       NULL,NULL,hInstance,NULL);
  162.  
  163.    /* If window could not be created, return "failure" */
  164.  
  165.    if (!hWnd)
  166.       return (FALSE);
  167.  
  168.    hMainWindow = hWnd;                       /* Save main window handle */
  169.  
  170.    hMainMenu = GetMenu(hMainWindow);
  171.  
  172.    /* Determine if we are running monochrome and set flag appropriately */ 
  173.    hdc = GetDC(hMainWindow);
  174.    fColor = (GetDeviceCaps(hdc,NUMCOLORS) > 2);
  175.    ReleaseDC(hMainWindow,hdc);
  176.                                                                        
  177.    /* Load the appropriate bitmap for the toolbar */
  178.    if (fColor)
  179.       hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(2));
  180.    else
  181.       hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(4));
  182.                                                     
  183.    /* Create toolbar (initially visible) */
  184.    hToolBar = CreateToolbar(hMainWindow,hBitmap,13,TRUE,(LPTOOLINFO)tBar);
  185.    if (!hToolBar)
  186.       MessageBox(hWnd,"Unable to create tool bar.",NULL,MB_OK);
  187.  
  188.    GetClientRect(hToolBar,&rc);
  189.                        
  190.    /* Load the appropriate bitmap for the toolbox */ 
  191.    if (fColor)
  192.       hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(1));
  193.    else
  194.       hBitmap = LoadBitmap(hInst,MAKEINTRESOURCE(3));
  195.                                                  
  196.    /* Create the toolbox (initially visible) */
  197.    hToolBox = CreateToolbox(hMainWindow,hBitmap,16,10,rc.bottom+5,2,8,TRUE,
  198.       (LPTOOLINFO)tBox);
  199.    if (!hToolBox)
  200.       MessageBox(hWnd,"Unable to create tool box.",NULL,MB_OK);
  201.  
  202.    /* Set global flags, initialize menu items and tools */
  203.    fToolbox = fToolbar = fHzScroll = fVtScroll = TRUE;
  204.    fToolsEnabled = TRUE;
  205.    CheckMenuItem(hMainMenu,IDM_VIEW_TOOLBOX,MF_CHECKED);
  206.    CheckMenuItem(hMainMenu,IDM_VIEW_TOOLBAR,MF_CHECKED);
  207.    CheckMenuItem(hMainMenu,IDM_VIEW_H,MF_CHECKED);
  208.    CheckTool(hToolBar,IDM_VIEW_H,fHzScroll);
  209.    CheckMenuItem(hMainMenu,IDM_VIEW_V,MF_CHECKED);
  210.    CheckTool(hToolBar,IDM_VIEW_V,fVtScroll);
  211.    CheckMenuItem(hMainMenu,IDM_HCTEXT,MF_CHECKED);
  212.    CheckTool(hToolBar,IDM_HCTEXT,TRUE);
  213.    wHorzPos = DT_CENTER;
  214.    CheckMenuItem(hMainMenu,IDM_VBTEXT,MF_CHECKED);
  215.    CheckTool(hToolBar,IDM_VBTEXT,TRUE);
  216.    wVertPos = DT_BOTTOM;
  217.  
  218.    /* Make the window visible; update its client area; and return "success" */
  219.    ShowWindow(hMainWindow,nCmdShow);
  220.    UpdateWindow(hMainWindow);
  221.    return (TRUE);
  222. }
  223.  
  224. /*
  225.    ****************************************************************************
  226.    MainWndProc()
  227.    Handles all messages to the main window.
  228.    ****************************************************************************
  229. */
  230.  
  231. long FAR PASCAL MainWndProc(hWnd, message, wParam, lParam)
  232. HWND hWnd;
  233. unsigned message;
  234. WORD wParam;
  235. LONG lParam;
  236. {
  237.    WORD wId;
  238.    RECT rcMain,rcTool;
  239.    PAINTSTRUCT ps;
  240.    int nBar;
  241.    int cur_pos,max_pos,min_pos,new_pos;
  242.    
  243.  
  244.    switch (message)
  245.    {
  246.       case WM_PAINT:
  247.          /* Draw text based on positions selected */
  248.          BeginPaint(hWnd,&ps);
  249.          GetClientRect(hWnd,&rcMain);
  250.          GetClientRect(hToolBar,&rcTool);
  251.          rcMain.left += 5;
  252.          rcMain.top += rcTool.bottom + 5;
  253.          rcMain.bottom -= 5;
  254.          rcMain.right -= 5;
  255.          DrawText(ps.hdc,(LPSTR)szOutput,lstrlen(szOutput),&rcMain,
  256.             wVertPos|wHorzPos|DT_SINGLELINE|DT_NOCLIP);
  257.          EndPaint(hWnd,&ps);
  258.          break;
  259.  
  260.       case WM_HSCROLL:
  261.       case WM_VSCROLL:
  262.          /* Update scroll bar positions */
  263.          nBar = (message == WM_HSCROLL) ? SB_HORZ : SB_VERT;
  264.          GetScrollRange(hWnd,nBar,&min_pos,&max_pos);
  265.          cur_pos = GetScrollPos(hWnd,nBar);
  266.          new_pos = cur_pos;
  267.          if (wParam == SB_LINEUP)
  268.             new_pos -= 1;
  269.          else if(wParam == SB_LINEDOWN)
  270.             new_pos += 1;
  271.          new_pos = max(min_pos,new_pos);
  272.          new_pos = min(max_pos,new_pos);
  273.          if (new_pos != cur_pos)
  274.             SetScrollPos(hWnd,nBar,new_pos,TRUE);
  275.          break;
  276.  
  277.       case WM_COMMAND:
  278.          switch (wParam)
  279.          {
  280.             case IDM_VIEW_README:            /* View readme.txt file */
  281.                WinExec("notepad readme.txt",SW_SHOWMAXIMIZED);
  282.                break;
  283.  
  284.             case IDM_EXIT:                   /* Close application */
  285.                SendMessage(hWnd,WM_CLOSE,0,0L);
  286.                break;
  287.  
  288.             case IDM_VIEW_TOOLBOX:
  289.                /* Toggle the view toolbox menu item and show or hide the */
  290.                /* toolbox window as is appropriate */
  291.                CheckMenuItem(hMainMenu,wParam,fToolbox ? MF_UNCHECKED : MF_CHECKED);
  292.                fToolbox = !fToolbox;
  293.                EnableMenuItem(hMainMenu,IDM_TBX_STATUS,fToolbox ? MF_ENABLED : MF_GRAYED);
  294.                ShowWindow(hToolBox,fToolbox ? SW_RESTORE : SW_HIDE);
  295.                break;
  296.  
  297.             case IDM_VIEW_TOOLBAR:
  298.                /* Toggle the view toolbar menu item and show or hide the */
  299.                /* toolbar window as is appropriate */
  300.                CheckMenuItem(hMainMenu,wParam,fToolbar ? MF_UNCHECKED : MF_CHECKED);
  301.                fToolbar = !fToolbar;
  302.                ShowWindow(hToolBar,fToolbar ? SW_RESTORE : SW_HIDE);
  303.                break;
  304.  
  305.             case IDM_TBX_STATUS:             /* Demo disabling of toolbox */
  306.                fToolsEnabled = !fToolsEnabled;
  307.                ModifyMenu(hMainMenu,IDM_TBX_STATUS,MF_BYCOMMAND|MF_STRING,IDM_TBX_STATUS,
  308.                   fToolsEnabled ? (LPSTR)"Disable Toolbox Tools" : (LPSTR)"Enable Tools");
  309.                for (wId = IDM_POINTER; wId <= IDM_FILEBOX; wId++)
  310.                   EnableTool(hToolBox,wId,fToolsEnabled);
  311.                break;
  312.  
  313.             case IDM_POINTER:
  314.             case IDM_COMBOBX:
  315.             case IDM_CHECKBX:
  316.             case IDM_EDITCTL:
  317.             case IDM_PICTCTL:
  318.             case IDM_PUSHBTN:
  319.             case IDM_STATIC:
  320.             case IDM_TIMER:
  321.             case IDM_GROUPBX:
  322.             case IDM_LISTBOX:
  323.             case IDM_RADIOBTN:
  324.             case IDM_HORZSCRL:
  325.             case IDM_VERTSCRL:
  326.             case IDM_DIRBOX:
  327.             case IDM_DRIVEBOX:
  328.             case IDM_FILEBOX:
  329.                ToggleMenuItems(hMainMenu,IDM_POINTER,IDM_FILEBOX,wParam);
  330.                /* If tool is not already selected on the toolbox window, */
  331.                /* call function to select it */
  332.                if (IsToolSelected(hToolBox,wParam) == FALSE)
  333.                   ToggleTools(hToolBox,IDM_POINTER,IDM_FILEBOX,wParam);
  334.                break;
  335.  
  336.             case IDM_LARROW:
  337.                SendMessage(hWnd,WM_HSCROLL,SB_LINEUP,0L);
  338.                break;
  339.  
  340.             case IDM_RARROW:
  341.                SendMessage(hWnd,WM_HSCROLL,SB_LINEDOWN,0L);
  342.                break;
  343.  
  344.             case IDM_DARROW:
  345.                SendMessage(hWnd,WM_VSCROLL,SB_LINEUP,0L);  
  346.                break;
  347.  
  348.             case IDM_UARROW:
  349.                SendMessage(hWnd,WM_VSCROLL,SB_LINEDOWN,0L);
  350.                break;
  351.  
  352.             case IDM_HLTEXT:
  353.             case IDM_HCTEXT:
  354.             case IDM_HRTEXT:
  355.                ToggleMenuItems(hMainMenu,IDM_HLTEXT,IDM_HRTEXT,wParam);
  356.                ToggleTools(hToolBar,IDM_HLTEXT,IDM_HRTEXT,wParam);
  357.                if (wParam == IDM_HLTEXT)
  358.                   wHorzPos = DT_LEFT;
  359.                else if (wParam == IDM_HCTEXT)
  360.                   wHorzPos = DT_CENTER;
  361.                else
  362.                   wHorzPos = DT_RIGHT;
  363.                InvalidateRect(hWnd,NULL,TRUE);
  364.                UpdateWindow(hWnd);
  365.                break;
  366.  
  367.             case IDM_VTTEXT:
  368.             case IDM_VCTEXT:
  369.             case IDM_VBTEXT:
  370.                ToggleMenuItems(hMainMenu,IDM_VTTEXT,IDM_VBTEXT,wParam);
  371.                ToggleTools(hToolBar,IDM_VTTEXT,IDM_VBTEXT,wParam);
  372.                if (wParam == IDM_VTTEXT)
  373.                   wVertPos = DT_TOP;
  374.                else if (wParam == IDM_VCTEXT)
  375.                   wVertPos = DT_VCENTER;
  376.                else
  377.                   wVertPos = DT_BOTTOM;
  378.                InvalidateRect(hWnd,NULL,TRUE);
  379.                UpdateWindow(hWnd);
  380.                break;
  381.  
  382.             case IDM_VIEW_H:
  383.                fHzScroll = !fHzScroll;
  384.                CheckTool(hToolBar,IDM_VIEW_H,fHzScroll);
  385.                CheckMenuItem(hMainMenu,IDM_VIEW_H,fHzScroll ? MF_CHECKED : MF_UNCHECKED);
  386.                ShowScrollBar(hWnd,SB_HORZ,fHzScroll);
  387.                EnableTool(hToolBar,IDM_LARROW,fHzScroll);
  388.                EnableTool(hToolBar,IDM_RARROW,fHzScroll);
  389.                break;
  390.  
  391.             case IDM_VIEW_V:
  392.                fVtScroll = !fVtScroll;
  393.                CheckTool(hToolBar,IDM_VIEW_V,fVtScroll);
  394.                CheckTool(hToolBar,IDM_VIEW_V,fVtScroll);
  395.                CheckMenuItem(hMainMenu,IDM_VIEW_V,fVtScroll ? MF_CHECKED : MF_UNCHECKED);
  396.                ShowScrollBar(hWnd,SB_VERT,fVtScroll);
  397.                EnableTool(hToolBar,IDM_UARROW,fVtScroll);
  398.                EnableTool(hToolBar,IDM_DARROW,fVtScroll);
  399.                break;
  400.  
  401.             case IDM_HLP_INDEX:
  402.             case IDM_HLP_KBD:
  403.             case IDM_HLP_CMD:
  404.             case IDM_HLP_PROC:
  405.             case IDM_HLP_USE:
  406.                MessageBox(hWnd,"Help not implemented!","Demo",MB_OK);
  407.                break;
  408.  
  409.             case IDM_ABOUT:
  410.                /* This function is contained in the demo version of the DLL */
  411.                AboutToolWnd(hWnd);
  412.                break;
  413.  
  414.             default:
  415.                break;
  416.          }
  417.          break;
  418.  
  419.       case TM_TBXCLOSED:                   /* Close from toolbox system menu */
  420.         CheckMenuItem(hMainMenu,IDM_VIEW_TOOLBOX,MF_UNCHECKED);
  421.         fToolbox = FALSE;
  422.         EnableMenuItem(hMainMenu,IDM_TBX_STATUS,MF_GRAYED);
  423.         break;
  424.  
  425.  
  426.       case WM_DESTROY:
  427.          PostQuitMessage(0);
  428.          break;
  429.  
  430.       default:
  431.          return (DefWindowProc(hWnd, message, wParam, lParam));
  432.    }
  433.    return (NULL);
  434. }
  435.  
  436. /*
  437.    ****************************************************************************
  438.    ToggleMenuItems()
  439.    Toggles the selection of the control menu.  This function works very similar
  440.    to the CheckRadioButton function for radio buttons.
  441.    ****************************************************************************
  442. */
  443.  
  444. void ToggleMenuItems(HMENU hMenu,WORD wFirst,WORD wLast,WORD wCurrent)
  445. {
  446.    WORD wCnt;
  447.  
  448.    for (wCnt=wFirst; wCnt <= wLast; wCnt++)
  449.    {
  450.       if (GetMenuState(hMenu,wCnt,MF_BYCOMMAND) & MF_CHECKED)
  451.       {
  452.          if (wCnt == wCurrent)
  453.             return;
  454.          CheckMenuItem(hMenu,wCnt,MF_BYCOMMAND|MF_UNCHECKED);
  455.       }
  456.    }
  457.    CheckMenuItem(hMenu,wCurrent,MF_BYCOMMAND|MF_CHECKED);
  458. }
  459.